package reflect;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *
 * reflect
 * 反射技术
 *
 * 反射 构造方法、域、和方法
 * 2018/5/5-11:20
 * 2018
 * Created by wuqiang on 2018/5/5.
 */
public class ReflectTest {
    /**
     * 反射构造方法
     */
    @Test
    public void testReflectConstructor(){
        //得到一个类的所有构造方法

    }

    /**
     * 反射域
     * @throws Exception
     */
    @Test
    public void testReflectField() throws Exception {
        Person p=new Person("wuq",26);
        //name是public的
        Field name = Class.forName("reflect.Person").getField("name");
        System.out.println(name.get(p));
        name.set(p,"gaoxiaojie");//修改字段的名称
        System.out.println(name.get(p));
        //age是private
        Field age = Class.forName("reflect.Person").getDeclaredField("age");
        age.setAccessible(true);//设置访问权限
        System.out.println(age.get(p));
    }

    /**
     * 用反射方式，反射类中的main方法
     * @throws Exception
     */
    @Test
    public void testReflectMain() throws Exception{
        /**
         * main方法的参数是一个字符串数组
         * 如果为 invoke方法传递参数呢？
         *
         *
         */
        Method main = Person.class.getMethod("main", String[].class);
        main.invoke(new Person(),new String[]{});//会报参数不匹配的异常
        main.invoke(new Person(),(Object) new String[]{});//应该把这个字符串数组当作一个对象处理

    }
}
